'''
    本模块提供了http交互时的数据结构以及接口
    
    HttpRequest     请求类, 用于存储 http请求 信息
    HttpResponse    响应类, 用于发送 http响应 信息

'''
from .url import api_dict
from .url import static_file_dict


__all__ = [
    "api_dict",             # 动态 api 接口
    "static_file_dict",     # 静态文件接口
    "HttpRequest",          # 请求类, 用于存储 http请求 信息
    "HttpResponse",         # 响应类, 用于发送 http响应 信息
    "static_web_file"       # 静态文件读取函数
]


class HttpRequest:
    def __init__(self) -> None:
        # self.recv_data = None  # 请求的所有信息(str: 后续该属性需要删除)
        self.method = None       # 请求方式
        self.url = None          # 请求地址
        self.version = None      # http协议的版本
        self.header = {}         # 请求头
        self.data = None         # 请求数据 (请求体)

    def init(self, recv_data):
        # self.recv_data = recv_data.encode('utf-8')
        idx = recv_data.find('\r\n')
        d = recv_data[:idx]
        recv_data = recv_data[idx+2:]
        idx = d.find(' ')
        self.method = d[:idx]              # 请求方式
        d = d[idx+1:]
        idx = d.find(' ')
        self.url = d[:idx]                 # 请求地址
        self.version = d[idx+1:]           # 协议版本
        idx = recv_data.find('\r\n\r\n')
        d = recv_data[:idx]
        self.data = recv_data[idx+4:]      # 请求数据
        d = d.split('\r\n')
        for i in d:                        # 请求头参数
            idx = i.find(':')
            self.header[i[:idx]] = i[idx+1:].strip()

class HttpResponse:
    def __init__(self) -> None:
        self.conn = None
        self.send_data = ''         # 返回的所有信息 (str)
        self.version = 'HTTP/1.1'   # http协议的版本
        self.status_code = '200'    # 状态码
        self.status_msg = 'OK'      # 状态消息
        self.header = {             # 响应报头
            'Cache-Control': 'no-cache',
            'context-type': 'text/html; charset=utf-8'
        }
        self.data = None            # 响应数据
        
    def setConn(self, conn):
        self.conn = conn

    def setHeader(self, header):
        for i in header:
            self.header[i] = header[i]

    def send(self, data):
        self.data = data
        self.send_data += f'{self.version} {self.status_code} {self.status_msg}\r\n'
        for i in self.header:
            self.send_data += f'{i}: {self.header[i]}\r\n'
        self.send_data += f'\r\n'
        self.send_data = self.send_data.encode('utf-8')
        self.send_data += self.data
        return self.conn.sendall(self.send_data)

def static_web_file(file_path):
    with open(file_path, 'rb') as f:
        file_data = f.read()
    return file_data






